package com.bigdata.spark.core.rdd.operator.transform

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

/**
 * @author : ranzlupup
 * @date : 2023/3/1 16:14
 */
object RDD_Transform_coalesce {
    def main(args: Array[String]): Unit = {
        val sparkConf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("RDD")
        val sparkContext: SparkContext = new SparkContext(sparkConf)
        val RDD: RDD[Int] = sparkContext.makeRDD(List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10))
        val RDD3: RDD[Int] = sparkContext.makeRDD(List(1, 1, 1, 1, 1, 2, 3, 4, 5))
        val RDD2: RDD[Int] = sparkContext.makeRDD(List(1, 2, 3, 4, 5, 6) , 3)

        // TODO RDD转换算子
        //      Value类型
        //      coalesce
        // 根据数据量缩减分区，用于大数据集过滤后，提高小数据集的执行效率
        // 当 spark 程序中，存在过多的小任务的时候，可以通过 coalesce 方法，
        // 收缩合并分区，减少分区的个数，减小任务调度成本
//        RDD2.coalesce(2)
//            .glom()
//            .map(_.mkString(", "))
//            .collect()
//            .foreach(println)
//
//        println("--------------")
//
//        // shuffle = true，会打乱每个分区中的数据，重新分区
//        RDD2.coalesce(2, shuffle = true)
//            .glom()
//            .map(_.mkString(", "))
//            .collect()
//            .foreach(println)
//        sparkContext.stop()

        println("---------------------")
        // TODO 扩大分区
        RDD2.coalesce(6, shuffle = true)
            .saveAsTextFile("output")

        // repartition 低层调用也是coalesce(shuffle=true)
        RDD2.repartition(6)
        sparkContext.stop()
    }
}
